Главный интерес представляет аргумент этой функции. Класс Graphics является базовым для всех контекстов, которые разрешают рисовать по компоненте. С другой стороны данный класс содержит функции необходимые для рисования, например drawLine, drawString, drawImage и т.д. вместе с вспомогательными для установки текущих шрифта (setFont), цвета линий или текста (setColor) и др.
В сегодняшнем примере предлагаю вспомнить детство - попробуем построить график синусоиды, для вычисления значений которой воспользуемся соответствующим статическим методом класса Math. Рисовать будем по панели, для чего создадим свой класс - потомок JPanel и перегрузим соответствующий метод.
import java.awt.*; import javax.swing.*; public class PaintApp extends JFrame { public PaintApp(String title) { super(title); //создадим свою рисующую пенель GraphSinPanel grSnPn=new GraphSinPanel(); grSnPn.setPreferredSize(new Dimension(300,300)); //установим нашу панель как ContentPane окна приложения setContentPane(grSnPn); } public static void main(String args[]) { PaintApp OurApp = new PaintApp("Graph of sin(x)"); OurApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); OurApp.pack(); OurApp.setVisible(true); } } class GraphSinPanel extends JPanel { private int Wth, Hig; private int PrevX, PrevY, CurX, CurY; private final double Pi=Math.PI; private Font curFont; private FontMetrics curFontMetrics; public GraphSinPanel() { super(); //задаем фон setBackground(Color.black); //получим текущий шрифт и его метрику //это понадобится для определения длины текста curFont=getFont(); curFontMetrics=getFontMetrics(curFont); } //две нижеследующие функции мне понадобились для преобразования //системы координат (стандартно начало отсчета находится в левом //верхнем углу, ось Х идет направо, ось У - вниз). Я выбрал систему //координат с началом в центре и такими диапазонами: -5Pi/2< x < 5Pi/2, //-1.5< y <1.5 private int Convert_X(double x) { return (int)((Wth/2)+(x/(5*Pi/2))*(Wth/2)); } private int Convert_Y(double x) { return (int)((Hig/2)-(x/(1.5))*(Hig/2)); } //функция - гвоздь программы public void paintComponent(Graphics g) { //вызовем соответствующий родительский метод для отрисовки фона super.paintComponent(g); //получим размеры области рисования Wth=getSize().width; Hig=getSize().height; //устанавливаем цвет g.setColor(Color.white); //рисуем оси, стрелки и т.д. g.drawLine(Convert_X(-5*Pi/2)+5, Convert_Y(0), Convert_X(5*Pi/2)-5, Convert_Y(0)); g.drawLine(Convert_X(0), Convert_Y(1.5)+5, Convert_X(0), Convert_Y(-1.5)-5); g.drawLine(Convert_X(5*Pi/2)-5, Convert_Y(0), Convert_X(5*Pi/2)-15, Convert_Y(0)+3); g.drawLine(Convert_X(5*Pi/2)-5, Convert_Y(0), Convert_X(5*Pi/2)-15, Convert_Y(0)-3); g.drawLine(Convert_X(0), Convert_Y(1.5)+5, Convert_X(0)-3, Convert_Y(1.5)+15); g.drawLine(Convert_X(0), Convert_Y(1.5)+5, Convert_X(0)+3, Convert_Y(1.5)+15); g.drawLine(Convert_X(-2*Pi), Convert_Y(-0.05), Convert_X(-2*Pi), Convert_Y(0.05)); g.drawLine(Convert_X(-Pi), Convert_Y(-0.05), Convert_X(-Pi), Convert_Y(0.05)); g.drawLine(Convert_X(Pi), Convert_Y(-0.05), Convert_X(Pi), Convert_Y(0.05)); g.drawLine(Convert_X(2*Pi), Convert_Y(-0.05), Convert_X(2*Pi), Convert_Y(0.05)); g.drawLine(Convert_X(-0.05), Convert_Y(1), Convert_X(0.05), Convert_Y(1)); g.drawLine(Convert_X(-0.05), Convert_Y(-1), Convert_X(0.05), Convert_Y(-1)); g.setColor(Color.green); PrevX=Convert_X(-2*Pi); PrevY=Convert_Y(Math.sin(-2*Pi)); //рисуем саму синусоиду... for (double delta=(-2*Pi); delta<=(2*Pi); delta+=(4*Pi/200)) { CurX=Convert_X(delta); CurY=Convert_Y(Math.sin(delta)); g.drawLine(PrevX, PrevY, CurX, CurY); PrevX=CurX; PrevY=CurY; } //подпишем оси, значения... g.setColor(Color.red); g.drawString("-2Pi",Convert_X(-2*Pi)-(int)(curFontMetrics.stringWidth("-2Pi")/2), Convert_Y(-0.06)+curFontMetrics.getHeight()); g.drawString("-Pi",Convert_X(-Pi)-(int)(curFontMetrics.stringWidth("-Pi")/2), Convert_Y(-0.06)+curFontMetrics.getHeight()); g.drawString("Pi",Convert_X(Pi)-(int)(curFontMetrics.stringWidth("Pi")/2), Convert_Y(-0.06)+curFontMetrics.getHeight()); g.drawString("2Pi",Convert_X(2*Pi)-(int)(curFontMetrics.stringWidth("2Pi")/2), Convert_Y(-0.06)+curFontMetrics.getHeight()); g.drawString("-1",Convert_X(0.1),Convert_Y(-1)+(int)(curFont.getSize()/2)); g.drawString("1",Convert_X(0.1),Convert_Y(1)+(int)(curFont.getSize()/2)); g.drawString("0",Convert_X(0.1),Convert_Y(0)+curFont.getSize()); g.setColor(Color.yellow); g.drawString("x",Convert_X(5*Pi/2)-15,Convert_Y(0)+curFont.getSize()+5); g.drawString("y",Convert_X(0)+5,Convert_Y(1.5)+curFont.getSize()); g.drawString("Y=SIN(X)",Convert_X(Pi)+5,Convert_Y(1.1)+curFont.getSize()); } }Компилируем, запускаем, смотрим. У меня получилось что-то такое: